{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " “委托（delegate）”本身不是 GoF 经典 23 个设计模式之一，它更像是一种**语言机制**或**设计技巧**，用于支持或实现其他设计模式。只有在特定语境下，人们才把基于委托的结构称作“委托模式”“委托机制”或“委托式设计”。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Delegation 在面向对象史上的定位\n",
    "\n",
    "| 术语                               | 含义                                                         | 关系                                           |\n",
    "| ---------------------------------- | ------------------------------------------------------------ | ---------------------------------------------- |\n",
    "| **Delegation（委托/委派）**        | 让一个对象把职责转交给另一个对象来完成，是一种对象协作技巧。 | 是一种面向对象设计原则，强调“用组合代替继承”。 |\n",
    "| **Delegate（委托类型/语言特性）**  | 在 C#、Objective-C、Swift 等语言里，表示可封装回调的类型。   | 属于语言特性，用来实现回调、事件等机制。       |\n",
    "| **Delegation Pattern（委托模式）** | 某些文献或社区把“对象把请求转交给代理对象执行”描述为一种模式。 | 更多是非 GoF 的“惯用法”，而非独立的经典模式。  |\n",
    "\n",
    "> 例如 Smalltalk/Objective-C 中的 delegation 是通过消息转发实现的组合，Objective-C 的 `delegate` 属性就是“让屏幕控件把事件回调交给外部对象”。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与经典设计模式的关系\n",
    "\n",
    "- GoF 书中虽然没有“Delegate”模式，但在讨论继承 vs 组合时明确强调“**倾向于组合/委托**”。\n",
    "- 许多经典模式可以借助委托机制实现，例如：\n",
    "  - **观察者模式**：监听者注册回调；C# 里用 `delegate`/`event` 简化。\n",
    "  - **策略模式**：把算法封装成委托传入。\n",
    "  - **命令模式**：用委托封装要执行的操作，实现轻量级命令对象。\n",
    "- 在 JavaScript 中，“事件委托（Event Delegation）”通常指 DOM 事件冒泡时，把事件处理委托给父节点，这更像是一种具体技巧/惯用法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "什么时候会被称为“委托模式”？\n",
    "\n",
    "在某些框架或领域中，如果“把职责交给单独对象/函数”的做法是一个命名良好的约定，人们会把它称作“委托模式”或“Delegation Pattern”，例如：\n",
    "\n",
    "1. **GUI / Cocoa / iOS 开发**\n",
    "    UIKit 的 `UITableView` 使用 delegate 协议把数据源和行为交给外部对象，这种组织方式被官方文档称为 “Delegation pattern”。\n",
    "2. **事件系统 / 回调框架**\n",
    "    若框架明确提出“注册一个 delegate 对象（或 function）来处理回调”，也会称自己采用了“委托模式”。\n",
    "\n",
    "不过，这里的“模式”更多是行业术语，而不是 GoF 式的标准化模板。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# C++ `std::function`/lambda 与“委托”"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在现代 C++ 中，我们使用 `std::function` 搭配 lambda 或可调用对象来实现回调，即："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "using Handler = std::function<void(int)>;\n",
    "\n",
    "class Notifier {\n",
    "public:\n",
    "    void setHandler(Handler h) { handler_ = std::move(h); }\n",
    "    void fire(int value) {\n",
    "        if (handler_) handler_(value);\n",
    "    }\n",
    "private:\n",
    "    Handler handler_;\n",
    "};"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- **语义上**：我们把响应逻辑委托给了外部提供的函数/对象，体现了“delegation”思想。\n",
    "- **分类上**：更多是**语言特性的组合**，用于实现“观察者/策略/命令等模式”，而非一个独立的设计模式。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
